/*
 ╭──────────╮
╭│    ╭────╮
││    ╰────╯
││          │
╰│ ┌─────┌  │
 ╰─╯     ╰─╯ Lin.Meng. was a hardworking programmer.
                   No one can despise him.
                   And we have to bless his program without BUG!~    And program burned successfully!~
                   Bug,fuck out!!!!!!
                   :)
*/
/*                 .::::.
                 .::::::::.
                :::::::::::
             ..:::::::::::'
          '::::::::::::'
            .::::::::::
       '::::::::::::::..        女神助攻,程序烧写成功
            ..::::::::::::.     永不宕机,代码无bug
          ``::::::::::::::::
           ::::``:::::::::'        .:::.
          ::::'   ':::::'       .::::::::.
        .::::'      ::::     ..::::::'::::.
       .:::'       :::::  ..::::::::' ':::::.
      .::'        :::::..::::::::'      ':::::.
     .::'         ::::::::::::::'         ``::::.
 ...:::           ::::::::::::'              ``::.
```` ':.          ':::::::::'                  ::::..
                   '.:::::'                    ':'````..
*/
/*                   _ooOoo_
                    o8888888o
                   88\" . \"88
                   (|  $_$  |)    $
                    O\  =  /O
                ____/`---'\\____
              .'  \\\\|     |//  `.
             /   \\|||  :  |||//  \\
            /  _||||| -:- |||||-  \\
            |   | \\\\\\  -  /// |   |
            | \\_|  ''\\---/''  |   |
            \\  .-\\__  `-`  ___/-. /
          ___`. .'  /--.--\\  `. . ___
        .\"\" '<  `.___\\_<|>_/___.'  >'\"\".
      | | :  `- \\`.;`\\ _ /`;.`/ - ` : | |
      \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /
========`-.____`-.___\\_____/___.-`____.-'========
                     `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


   佛祖保佑       永不宕机     永无BUG    程序烧写成功 */

#include <ioCC2530.h> //引用 CC2530 头文件
#define SW1 P1_2      //宏定义，如下是LED宏定义
#define LED1 (P1_0)   //宏定义，LED1，简单好写。
#define LED2 (P1_1)   //宏定义，LED2，简单好写.
unsigned char t1_Count=0;       //定时器1溢出次数计数。
unsigned int t3_Count=0;        //定时器3溢出次数计数。（char不能使用）
unsigned int t3_Co2unt=0;       //定时器3溢出次数计数。（同上理由，这行为双通道定义数据类型）
unsigned int t4_Count=0;        //定时器4溢出次数计数。
unsigned int t4_Co2unt=0;       //定时器4溢出次数计数。（t4双通道，查看ioCC2530.h头文件即可明晓）

#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{
  IRCON = 0x00;       //清除定时器 1 溢出中断标志位
  t1_Count++;         //定时器 1 溢出次数加 1，溢出周期为 0.5 秒
}

void initUART0(void)
{
  PERCFG=0x00;
  P0SEL=0x3c;         //启动P0.2 P0.3 P0.4 P0.5作为外设IO口。第五单元PDF有详细介绍。
  U0CSR|=0x80;        //11110000 UART mode+禁止接收器+SPI 从
  U0UCR|=0x80;        //11110000 清除单元 +禁止流控制+奇校验+8位传送禁9位+1停止位低电平
  U0BAUD=216;         //U0BAUD.BAUD_M = 216 
  U0GCR=10;           //U0GCR.BAUD_M = 10 如上对应CC2530串行通信波特率 设置为57600 误差0.03%
  UTX0IF=0;           //清零UART0TX中断标志
  EA = 1;             //使能中断
}

void UART0SendByte(unsigned char c)
{
  U0DBUF = c;       // 将要发送的 1 字节数据写入 U0DBUF
  while (!UTX0IF);  // 等待 TX 中断标志，即 U0DBUF 就绪
  UTX0IF = 0;       // 清零 TX 中断标志
}

void UART0SendString(unsigned char *str)
{
  while(*str != '\0')
  {
    UART0SendByte(*str++); // 发送字节数据
  }
}

void initTimer1()
{
   CLKCONCMD &= 0x80;                 //时钟速度设置为 32MHz
   T1CTL = 0x0E;                      //配置 128 分频，模比较计数工作模式，并开始启动
   T1CCTL0 |= 0x04;                   //设定 timer1 通道 0 比较模式
   T1CC0L =50000 & 0xFF;              //把 50000 的低 8 位写入 T1CC0L
   T1CC0H =((50000 & 0xFF00) >> 8);   //把 50000 的高 8 位写入 T1CC0H
   T1IF=0;                            //清除 timer1 中断标志
   T1STAT &= ~0x01;                   //清除通道 0 中断标志
   TIMIF &= ~0x40;                    //不产生定时器 1 的溢出中断
   IEN1 |= 0x02;                      //使能定时器 1 的中断
   EA = 1;                            //使能全局中断
}

/***************************************************************************************************************
本次1.5.2020.1224.5-1Code版本，代码和写法均来自第五单元.pdf和CC2530中文数据手册完全版和头文件.
                               第五单元.pdf                 
                               ioCC2530.h                   C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin
                               本次为T1计时器写UART串口通信法。可以作为参考和模仿文件。
                               后续可能会上传更完善的模仿文件请大家关注。
                               当然，代码可能还会存在一些某些场景出现的BUG（光是软件Rubild All后其实看不出来的）
                               所以，还是请大家认真使用，计时器看需使用。使用教程其实注释变相的写了。
                               废话不多说，把代码远程git下来，开始你们的C之旅吧！
                               欢迎大家认真使用，本代码已经同步至GITEE仓库，遵守BY-NC-SA4.0协议，转载请署名。
***************************************************************************************************************/

void main(void) 
{
  /*LED1 LED2设置普通IO输出口完毕*/
  LED1 = 0;
  LED2 = 0;
  P1SEL &= ~0x03;     //设置P1.0和P1.1为普通IO口。P1.0 P1.1为LED
  P1DIR |= 0x03;      //设置P1.0和P1.1为输出口。  P1.0 P1.1为LED
  /*调用函数 initTimer1 initUART0 也已经完成初始化设置*/
  initTimer1();       //初始化如上函数，EA全局使能中断可以在这里写。
  initUART0();        //初始化如上上函数
  
  while(1)
  { 
    //设置发送已经设定好的数据,目前已经注释,无需使用**
    if(t1_Count>=15)  //定时器每 0.2 秒一次，15 次时间为 3 秒
    {
      LED1 = 1;
      UART0SendString("浩瀚银河 https://www.haohanyh.com ");
      LED1 = 0;
      LED2 = 1;
      UART0SendString("旨在于提供计算机软硬件的方方面面文章 \n");
      LED2 = 0;
      t1_Count = 0;
    }
    //设置接收,以下代码为第一题*/
  }
}